說明
Magento 是一個開源的電子商城購物網站,在客製化的時候,難免不了需要自己新增資料表及各式各樣的欄位,在 Magento 內部有實作了很好用的 方法,有助於我們資料表 Schema 的建立及還原。
執行環境
- Ubuntu Linux 16.04 LTS
- PhpStorm 2017.3
1. Magento Setup 方法
Magento 實作了一系列的方法,在執行 bin/magento setup:upgrade
的時候會依照順序執行的四個 Class 。
- InstallSchema
- InstallData
- UpgradeSchema
- UpgradeData
所以如果要在 upgrade
的時候執行這些 Class 內程式的話,就必須依照 Magento 的方法實作我們先實作空的檔案當作範例,之後加入 Schema 的資料。
2. 建立 InstallSchema Class
範例如下,看到他繼承 Magento\Framework\Setup\InstallSchemaInterface
這個 Namespace 的 Class。
<?php
namespace Astralweb\ORM\Setup;
use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
class InstallSchema implements InstallSchemaInterface
{
/**
* Function install
* @param SchemaSetupInterface $setup
* @param ModuleContextInterface $context
* @return void
*/
public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
$installer = $setup;
$installer->startSetup();
$installer->endSetup();
}
}
3. 建立 InstallData Class
<?php
namespace Astralweb\ORM\Setup;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
class InstallData implements InstallDataInterface
{
/**
* Function install
* @param ModuleDataSetupInterface $setup
* @param ModuleContextInterface $context
* @return void
*/
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
//install data here
}
}
4. 建立 UpgradeSchema Class
<?php
namespace Astralweb\ORM\Setup;
use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
/**
* @codeCoverageIgnore
*/
class UpgradeSchema implements UpgradeSchemaInterface
{
/**
* {@inheritdoc}
*/
public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
$setup->startSetup();
$connection = $setup->getConnection();
$setup->endSetup();
}
}
5. UpgradeData Class
<?php
namespace Astralweb\ORM\Setup;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\UpgradeDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
class UpgradeData implements UpgradeDataInterface
{
public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
$setup->startSetup();
$setup->endSetup();
}
}
6. 建立 Schema
若以 Employee 資料表為例,資料表需求如下
欄位名稱 | 型別 | 大小 | 主鍵 |
---|---|---|---|
entity_id | integer | 是 | |
name | var_char | 255 | 否 |
phone | var_char | 255 | 否 |
department | var_char | 255 | 否 |
created_at | datetime | 否 | |
updated_at | datetime | 否 |
若將上開欄位轉換為 Magento 的 Schema 格式的程式碼如下:
<?php
namespace Astralweb\ORM\Setup;
use Magento\Framework\DB\Ddl\Table;
use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
class InstallSchema implements InstallSchemaInterface
{
/**
* Function install
* @param SchemaSetupInterface $setup
* @param ModuleContextInterface $context
* @return void
* @throws \Zend_Db_Exception
*/
public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
$installer = $setup;
$installer->startSetup();
$table = $installer->getConnection()->newTable(
$installer->getTable('employee_entity')
)->addColumn(
'entity_id',
Table::TYPE_INTEGER,
null,
['identity' => true, 'nullable' => false, 'primary' => true, 'unsigned' => true,],
'Entity ID'
)->addColumn(
'name',
Table::TYPE_TEXT,
255,
['nullable' => false,],
'name'
)->addColumn(
'phone',
Table::TYPE_TEXT,
255,
['nullable' => false,],
'phone'
)->addColumn(
'department',
Table::TYPE_TEXT,
255,
['nullable' => false,],
'department'
)->addColumn(
'created_at',
Table::TYPE_TIMESTAMP,
null,
['nullable' => false, 'default' => Table::TIMESTAMP_INIT,],
'Creation Time'
)->addColumn(
'update_time',
Table::TYPE_TIMESTAMP,
null,
['nullable' => false, 'default' => Table::TIMESTAMP_INIT_UPDATE,],
'update time'
);
$installer->getConnection()->createTable($table);
}
}
7. 執行 upgrade 指令
設定完 Schema 之後,請在 command line
裡面輸入以下指令:
$ bin/magnet setup:upgrade
執行完後,就可以看到資料表出現在 Magento 的 資料庫內了